package honor.exam;

import java.util.*;
import java.util.stream.Collectors;

/**
 *求两个数组中 同时出现的元素，并按照在那个数组中出现的次数多排序
 */
public class HashSort {

    public static void main(String[] args) {
        int[] arr1 = new int[] {1,3,3,2,8,3,5,2,7,3};
        int[] arr2 = new int[] {2,4,7,2,5,3,5,6,8,3};
        sortByMap(arr1,arr2);
    }

//    private static void sortByQueue(int[] arr1,int[] arr2) {
//        Map<Integer, Integer> countMap1 = getCountMap(arr1);
//        Map<Integer, Integer> countMap2 = getCountMap(arr2);
//
//        PriorityQueue<Map.Entry<Integer, Integer>> priorityQueue1 = new PriorityQueue<>((a, b) -> b.getValue() - a.getValue());
//        priorityQueue1.addAll(countMap1.entrySet());
//        PriorityQueue<Map.Entry<Integer, Integer>> priorityQueue2 = new PriorityQueue<>((a, b) -> b.getValue() - a.getValue());
//        priorityQueue2.addAll(countMap2.entrySet());
//
//        priorityQueue1.forEach(entry -> {
//            Integer entryKey = entry.getKey();
//        });
//    }

    /**
     * 遍历得到map 再将map以value值排序得到key
     * @param arr1
     * @param arr2
     */
    private static void sortByMap(int[] arr1,int[] arr2) {
        Map<Integer, Integer> countMap1 = getCountMap(arr1);
        Map<Integer, Integer> countMap2 = getCountMap(arr2);

        Map<Integer, Integer> result = new HashMap<>();
        countMap1.keySet().forEach(key -> {
            Integer integer1 = countMap1.get(key);
            Integer integer2 = countMap2.get(key);
            if (integer2 != null) {
                // 这个数在两个数组中同时存在
                result.put(key,Math.max(integer1,integer2));
            }
        });
        List<Integer> sortByValue = sortByValue(result);
        System.out.println(sortByValue);
    }

    private static List<Integer> sortByValue(Map<Integer,Integer> map) {
        return map.entrySet().stream()
                .sorted((o1, o2) -> o2.getValue()- o1.getValue())
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());
    }

    private static Map<Integer,Integer> getCountMap(int[] arr) {
        Map<Integer, Integer> countMap = new HashMap<>(arr.length);
        for (int e: arr) {
            countMap.put(e,countMap.getOrDefault(e,0) +1);
        }
        return countMap;
    }
}
